home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / include / alsa / sound / ainstr_iw.h < prev    next >
C/C++ Source or Header  |  2006-01-09  |  12KB  |  378 lines

  1. /*
  2.  *  Advanced Linux Sound Architecture
  3.  *
  4.  *  InterWave FFFF Instrument Format
  5.  *  Copyright (c) 1994-99 by Jaroslav Kysela <perex@suse.cz>
  6.  *
  7.  *
  8.  *   This program is free software; you can redistribute it and/or modify
  9.  *   it under the terms of the GNU General Public License as published by
  10.  *   the Free Software Foundation; either version 2 of the License, or
  11.  *   (at your option) any later version.
  12.  *
  13.  *   This program is distributed in the hope that it will be useful,
  14.  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  *   GNU General Public License for more details.
  17.  *
  18.  *   You should have received a copy of the GNU General Public License
  19.  *   along with this program; if not, write to the Free Software
  20.  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  21.  *
  22.  */
  23.  
  24. #ifndef __SOUND_AINSTR_IW_H
  25. #define __SOUND_AINSTR_IW_H
  26.  
  27. #ifndef __KERNEL__
  28. #define __KERNEL__
  29. #include <asm/types.h>
  30. #include <asm/byteorder.h>
  31. #undef __KERNEL__
  32. #endif
  33.  
  34. /*
  35.  *  share types (share ID 1)
  36.  */
  37.  
  38. #define IWFFFF_SHARE_FILE        0
  39.  
  40. /*
  41.  *  wave formats
  42.  */
  43.  
  44. #define IWFFFF_WAVE_16BIT        0x0001  /* 16-bit wave */
  45. #define IWFFFF_WAVE_UNSIGNED        0x0002  /* unsigned wave */
  46. #define IWFFFF_WAVE_INVERT        0x0002  /* same as unsigned wave */
  47. #define IWFFFF_WAVE_BACKWARD        0x0004  /* backward mode (maybe used for reverb or ping-ping loop) */
  48. #define IWFFFF_WAVE_LOOP        0x0008  /* loop mode */
  49. #define IWFFFF_WAVE_BIDIR        0x0010  /* bidirectional mode */
  50. #define IWFFFF_WAVE_ULAW        0x0020  /* uLaw compressed wave */
  51. #define IWFFFF_WAVE_RAM            0x0040  /* wave is _preloaded_ in RAM (it is used for ROM simulation) */
  52. #define IWFFFF_WAVE_ROM            0x0080  /* wave is in ROM */
  53. #define IWFFFF_WAVE_STEREO        0x0100    /* wave is stereo */
  54.  
  55. /*
  56.  *  Wavetable definitions
  57.  */
  58.  
  59. typedef struct iwffff_wave {
  60.     unsigned int share_id[4];    /* share id - zero = no sharing */
  61.     unsigned int format;        /* wave format */
  62.  
  63.     struct {
  64.         unsigned int number;    /* some other ID for this wave */
  65.         unsigned int memory;    /* begin of waveform in onboard memory */
  66.         unsigned char *ptr;    /* pointer to waveform in system memory */
  67.     } address;
  68.  
  69.     unsigned int size;        /* size of waveform in samples */
  70.     unsigned int start;        /* start offset in samples * 16 (lowest 4 bits - fraction) */
  71.     unsigned int loop_start;    /* bits loop start offset in samples * 16 (lowest 4 bits - fraction) */
  72.     unsigned int loop_end;        /* loop start offset in samples * 16 (lowest 4 bits - fraction) */
  73.     unsigned short loop_repeat;    /* loop repeat - 0 = forever */
  74.     unsigned int sample_ratio;    /* sample ratio (44100 * 1024 / rate) */
  75.     unsigned char attenuation;    /* 0 - 127 (no corresponding midi controller) */
  76.     unsigned char low_note;        /* lower frequency range for this waveform */
  77.     unsigned char high_note;    /* higher frequency range for this waveform */
  78.     unsigned char pad;
  79.   
  80.     struct iwffff_wave *next;
  81. } iwffff_wave_t;
  82.  
  83. /*
  84.  *  Layer
  85.  */
  86.  
  87. #define IWFFFF_LFO_SHAPE_TRIANGLE    0
  88. #define IWFFFF_LFO_SHAPE_POSTRIANGLE    1
  89.  
  90. typedef struct iwffff_lfo {
  91.     unsigned short freq;        /* (0-2047) 0.01Hz - 21.5Hz */
  92.     signed short depth;        /* volume +- (0-255) 0.48675dB/step */
  93.     signed short sweep;        /* 0 - 950 deciseconds */
  94.     unsigned char shape;        /* see to IWFFFF_LFO_SHAPE_XXXX */
  95.     unsigned char delay;        /* 0 - 255 deciseconds */
  96. } iwffff_lfo_t;
  97.  
  98. #define IWFFFF_ENV_FLAG_RETRIGGER    0x0001    /* flag - retrigger */
  99.  
  100. #define IWFFFF_ENV_MODE_ONE_SHOT    0x0001    /* mode - one shot */
  101. #define IWFFFF_ENV_MODE_SUSTAIN        0x0002    /* mode - sustain */
  102. #define IWFFFF_ENV_MODE_NO_SUSTAIN    0x0003    /* mode - no sustain */
  103.  
  104. #define IWFFFF_ENV_INDEX_VELOCITY    0x0001    /* index - velocity */
  105. #define IWFFFF_ENV_INDEX_FREQUENCY    0x0002    /* index - frequency */
  106.  
  107. typedef struct iwffff_env_point {
  108.     unsigned short offset;
  109.     unsigned short rate;
  110. } iwffff_env_point_t;
  111.  
  112. typedef struct iwffff_env_record {
  113.     unsigned short nattack;
  114.     unsigned short nrelease;
  115.     unsigned short sustain_offset;
  116.     unsigned short sustain_rate;
  117.     unsigned short release_rate;
  118.     unsigned char hirange;
  119.     unsigned char pad;
  120.     struct iwffff_env_record *next;
  121.     /* points are stored here */
  122.     /* count of points = nattack + nrelease */
  123. } iwffff_env_record_t;
  124.  
  125. typedef struct iwffff_env {
  126.     unsigned char flags;
  127.       unsigned char mode;
  128.       unsigned char index;
  129.     unsigned char pad;
  130.     struct iwffff_env_record *record;
  131. } iwffff_env_t;
  132.  
  133. #define IWFFFF_LAYER_FLAG_RETRIGGER    0x0001    /* retrigger */
  134.  
  135. #define IWFFFF_LAYER_VELOCITY_TIME    0x0000    /* velocity mode = time */
  136. #define IWFFFF_LAYER_VELOCITY_RATE    0x0001    /* velocity mode = rate */
  137.  
  138. #define IWFFFF_LAYER_EVENT_KUP        0x0000    /* layer event - key up */
  139. #define IWFFFF_LAYER_EVENT_KDOWN    0x0001    /* layer event - key down */
  140. #define IWFFFF_LAYER_EVENT_RETRIG    0x0002    /* layer event - retrigger */
  141. #define IWFFFF_LAYER_EVENT_LEGATO    0x0003    /* layer event - legato */
  142.  
  143. typedef struct iwffff_layer {
  144.     unsigned char flags;
  145.     unsigned char velocity_mode;
  146.           unsigned char layer_event;
  147.     unsigned char low_range;    /* range for layer based */
  148.     unsigned char high_range;    /* on either velocity or frequency */
  149.     unsigned char pan;        /* pan offset from CC1 (0 left - 127 right) */
  150.     unsigned char pan_freq_scale;    /* position based on frequency (0-127) */
  151.     unsigned char attenuation;    /* 0-127 (no corresponding midi controller) */
  152.     iwffff_lfo_t tremolo;        /* tremolo effect */
  153.     iwffff_lfo_t vibrato;        /* vibrato effect */
  154.     unsigned short freq_scale;    /* 0-2048, 1024 is equal to semitone scaling */
  155.     unsigned char freq_center;    /* center for keyboard frequency scaling */
  156.     unsigned char pad;
  157.     iwffff_env_t penv;        /* pitch envelope */
  158.     iwffff_env_t venv;        /* volume envelope */
  159.  
  160.     iwffff_wave_t *wave;
  161.     struct iwffff_layer *next;
  162. } iwffff_layer_t;
  163.  
  164. /*
  165.  *  Instrument
  166.  */
  167.  
  168. #define IWFFFF_EXCLUDE_NONE        0x0000    /* exclusion mode - none */
  169. #define IWFFFF_EXCLUDE_SINGLE        0x0001    /* exclude single - single note from the instrument group */
  170. #define IWFFFF_EXCLUDE_MULTIPLE        0x0002    /* exclude multiple - stop only same note from this instrument */
  171.  
  172. #define IWFFFF_LAYER_NONE        0x0000    /* not layered */
  173. #define IWFFFF_LAYER_ON            0x0001    /* layered */
  174. #define IWFFFF_LAYER_VELOCITY        0x0002    /* layered by velocity */
  175. #define IWFFFF_LAYER_FREQUENCY        0x0003    /* layered by frequency */
  176.  
  177. #define IWFFFF_EFFECT_NONE        0
  178. #define IWFFFF_EFFECT_REVERB        1
  179. #define IWFFFF_EFFECT_CHORUS        2
  180. #define IWFFFF_EFFECT_ECHO        3
  181.  
  182. typedef struct {
  183.     unsigned short exclusion;
  184.     unsigned short layer_type;
  185.     unsigned short exclusion_group;    /* 0 - none, 1-65535 */
  186.  
  187.     unsigned char effect1;        /* effect 1 */
  188.     unsigned char effect1_depth;    /* 0-127 */
  189.     unsigned char effect2;        /* effect 2 */
  190.     unsigned char effect2_depth;    /* 0-127 */
  191.  
  192.     iwffff_layer_t *layer;        /* first layer */
  193. } iwffff_instrument_t;
  194.  
  195. /*
  196.  *
  197.  *    Kernel <-> user space
  198.  *    Hardware (CPU) independent section
  199.  *
  200.  *    * = zero or more
  201.  *    + = one or more
  202.  *
  203.  *    iwffff_xinstrument        IWFFFF_STRU_INSTR
  204.  *      +iwffff_xlayer            IWFFFF_STRU_LAYER
  205.  *        *iwffff_xenv_record        IWFFFF_STRU_ENV_RECT (tremolo)
  206.  *        *iwffff_xenv_record        IWFFFF_STRU_EVN_RECT (vibrato)
  207.  *          +iwffff_xwave        IWFFFF_STRU_WAVE
  208.  *
  209.  */
  210.  
  211. #define IWFFFF_STRU_WAVE    __cpu_to_be32(('W'<<24)|('A'<<16)|('V'<<8)|'E')
  212. #define IWFFFF_STRU_ENV_RECP    __cpu_to_be32(('E'<<24)|('N'<<16)|('R'<<8)|'P')
  213. #define IWFFFF_STRU_ENV_RECV    __cpu_to_be32(('E'<<24)|('N'<<16)|('R'<<8)|'V')
  214. #define IWFFFF_STRU_LAYER     __cpu_to_be32(('L'<<24)|('A'<<16)|('Y'<<8)|'R')
  215. #define IWFFFF_STRU_INSTR     __cpu_to_be32(('I'<<24)|('N'<<16)|('S'<<8)|'T')
  216.  
  217. /*
  218.  *  Wavetable definitions
  219.  */
  220.  
  221. typedef struct iwffff_xwave {
  222.     __u32 stype;            /* structure type */
  223.  
  224.     __u32 share_id[4];        /* share id - zero = no sharing */
  225.  
  226.     __u32 format;            /* wave format */
  227.     __u32 offset;            /* offset to ROM (address) */
  228.  
  229.     __u32 size;            /* size of waveform in samples */
  230.     __u32 start;            /* start offset in samples * 16 (lowest 4 bits - fraction) */
  231.     __u32 loop_start;        /* bits loop start offset in samples * 16 (lowest 4 bits - fraction) */
  232.     __u32 loop_end;            /* loop start offset in samples * 16 (lowest 4 bits - fraction) */
  233.     __u16 loop_repeat;        /* loop repeat - 0 = forever */
  234.     __u32 sample_ratio;        /* sample ratio (44100 * 1024 / rate) */
  235.     __u8 attenuation;        /* 0 - 127 (no corresponding midi controller) */
  236.     __u8 low_note;            /* lower frequency range for this waveform */
  237.     __u8 high_note;            /* higher frequency range for this waveform */
  238.     __u8 pad;
  239. } iwffff_xwave_t;
  240.  
  241. /*
  242.  *  Layer
  243.  */
  244.  
  245. typedef struct iwffff_xlfo {
  246.     __u16 freq;            /* (0-2047) 0.01Hz - 21.5Hz */
  247.     __s16 depth;            /* volume +- (0-255) 0.48675dB/step */
  248.     __s16 sweep;            /* 0 - 950 deciseconds */
  249.     __u8 shape;            /* see to ULTRA_IW_LFO_SHAPE_XXXX */
  250.     __u8 delay;            /* 0 - 255 deciseconds */
  251. } iwffff_xlfo_t;
  252.  
  253. typedef struct iwffff_xenv_point {
  254.     __u16 offset;
  255.     __u16 rate;
  256. } iwffff_xenv_point_t;
  257.  
  258. typedef struct iwffff_xenv_record {
  259.     __u32 stype;
  260.     __u16 nattack;
  261.     __u16 nrelease;
  262.     __u16 sustain_offset;
  263.     __u16 sustain_rate;
  264.     __u16 release_rate;
  265.     __u8 hirange;
  266.     __u8 pad;
  267.     /* points are stored here.. */
  268.     /* count of points = nattack + nrelease */
  269. } iwffff_xenv_record_t;
  270.  
  271. typedef struct iwffff_xenv {
  272.     __u8 flags;
  273.       __u8 mode;
  274.       __u8 index;
  275.     __u8 pad;
  276. } iwffff_xenv_t;
  277.  
  278. typedef struct iwffff_xlayer {
  279.     __u32 stype;
  280.     __u8 flags;
  281.     __u8 velocity_mode;
  282.           __u8 layer_event;
  283.     __u8 low_range;            /* range for layer based */
  284.     __u8 high_range;        /* on either velocity or frequency */
  285.     __u8 pan;            /* pan offset from CC1 (0 left - 127 right) */
  286.     __u8 pan_freq_scale;        /* position based on frequency (0-127) */
  287.     __u8 attenuation;        /* 0-127 (no corresponding midi controller) */
  288.     iwffff_xlfo_t tremolo;        /* tremolo effect */
  289.     iwffff_xlfo_t vibrato;        /* vibrato effect */
  290.     __u16 freq_scale;        /* 0-2048, 1024 is equal to semitone scaling */
  291.     __u8 freq_center;        /* center for keyboard frequency scaling */
  292.     __u8 pad;
  293.     iwffff_xenv_t penv;        /* pitch envelope */
  294.     iwffff_xenv_t venv;        /* volume envelope */
  295. } iwffff_xlayer_t;
  296.  
  297. /*
  298.  *  Instrument
  299.  */
  300.  
  301. typedef struct iwffff_xinstrument {
  302.     __u32 stype;
  303.     
  304.     __u16 exclusion;
  305.     __u16 layer_type;
  306.     __u16 exclusion_group;        /* 0 - none, 1-65535 */
  307.  
  308.     __u8 effect1;            /* effect 1 */
  309.     __u8 effect1_depth;        /* 0-127 */
  310.     __u8 effect2;            /* effect 2 */
  311.     __u8 effect2_depth;        /* 0-127 */
  312. } iwffff_xinstrument_t;
  313.  
  314. /*
  315.  *  ROM support
  316.  *    InterWave ROMs are Little-Endian (x86)
  317.  */
  318.  
  319. #define IWFFFF_ROM_HDR_SIZE    512
  320.  
  321. typedef struct {
  322.     __u8 iwave[8];
  323.     __u8 revision;
  324.     __u8 series_number;
  325.     __u8 series_name[16];
  326.     __u8 date[10];
  327.     __u16 vendor_revision_major;
  328.     __u16 vendor_revision_minor;
  329.     __u32 rom_size;
  330.     __u8 copyright[128];
  331.     __u8 vendor_name[64];
  332.     __u8 description[128];
  333. } iwffff_rom_header_t;
  334.  
  335. /*
  336.  *  Instrument info
  337.  */
  338.  
  339. #define IWFFFF_INFO_LFO_VIBRATO        (1<<0)
  340. #define IWFFFF_INFO_LFO_VIBRATO_SHAPE    (1<<1)
  341. #define IWFFFF_INFO_LFO_TREMOLO        (1<<2)
  342. #define IWFFFF_INFO_LFO_TREMOLO_SHAPE    (1<<3)
  343.  
  344. typedef struct iwffff_info {
  345.     unsigned int format;        /* supported format bits */
  346.     unsigned int effects;        /* supported effects (1 << IWFFFF_EFFECT*) */
  347.     unsigned int lfos;        /* LFO effects */
  348.     unsigned int max8_len;        /* maximum 8-bit wave length */
  349.     unsigned int max16_len;        /* maximum 16-bit wave length */
  350. } iwffff_info_t;
  351.  
  352. #ifdef __KERNEL__
  353.  
  354. #include "seq_instr.h"
  355.  
  356. extern char *snd_seq_iwffff_id;
  357.  
  358. typedef struct {
  359.     void *private_data;
  360.     int (*info)(void *private_data, iwffff_info_t *info);
  361.     int (*put_sample)(void *private_data, iwffff_wave_t *wave,
  362.                       char *data, long len, int atomic);
  363.     int (*get_sample)(void *private_data, iwffff_wave_t *wave,
  364.               char *data, long len, int atomic);
  365.     int (*remove_sample)(void *private_data, iwffff_wave_t *wave,
  366.                  int atomic);
  367.     void (*notify)(void *private_data, snd_seq_kinstr_t *instr, int what);
  368.     snd_seq_kinstr_ops_t kops;
  369. } snd_iwffff_ops_t;
  370.  
  371. int snd_seq_iwffff_init(snd_iwffff_ops_t *ops,
  372.             void *private_data,
  373.                         snd_seq_kinstr_ops_t *next);
  374.  
  375. #endif
  376.  
  377. #endif /* __SOUND_AINSTR_IW_H */
  378.